//// dma.cpp --dma class methods
//#include "test_0301.h"
//#include <cstring>
//
//// baseDMA methods
//baseDMA::baseDMA(const char* l, int r)
//{
//	label = new char[std::strlen(l) + 1];
//	std::strcpy(label, l);
//	rating = r;
//}
//
//baseDMA::baseDMA(const baseDMA& rs)
//{
//	label = new char[std::strlen(rs.label) + 1];
//	std::strcpy(label, rs.label);
//	rating = rs.rating;
//}
//
//baseDMA::~baseDMA()
//{
//	delete[] label;
//}
//
//baseDMA& baseDMA::operator=(const baseDMA& rs)
//{
//	if (this == &rs)
//	{
//		return *this;
//	}
//	delete[] label;
//	label = new char[std::strlen(rs.label) + 1];
//	std::strcpy(label, rs.label);
//	rating = rs.rating;
//	return *this;
//}
//
//std::ostream& operator<<(std::ostream& os, const baseDMA& rs)
//{
//	os << "Label: " << rs.label << std::endl;
//	os << "Rating: " << rs.rating << std::endl;
//	return os;
//}
//
//// lacksDMA methods
//lacksDMA::lacksDMA(const char* c, const char* l, int r)
//	:baseDMA(l, r)
//{
//	std::strncpy(color, c, 39);
//	color[39] = '\0';
//}
//
//lacksDMA::lacksDMA(const char* c, const baseDMA& rs)
//	:baseDMA(rs)
//{
//	std::strncpy(color, c, COL_LEN - 1);
//	color[COL_LEN - 1] = '\0';
//}
//
//std::ostream& operator<<(std::ostream& os, const lacksDMA& ls)
//{
//	os << (const baseDMA&)ls;
//	os << "Color: " << ls.color << std::endl;
//	return os;
//}
//
//// hasDMA methods
//hasDMA::hasDMA(const char* s, const char* l, int r)
//	:baseDMA(l, r)
//{
//	style = new char[std::strlen(s) + 1];
//	std::strcpy(style, s);
//}
//
//hasDMA::hasDMA(const char* s, const baseDMA& rs)
//	:baseDMA(rs)
//{
//	style = new char[std::strlen(s) + 1];
//	std::strcpy(style, s);
//}
//
//hasDMA::hasDMA(const hasDMA& hs)
//	:baseDMA(hs)	// invoke base class copy constructor
//{
//	style = new char[std::strlen(hs.style) + 1];
//	std::strcpy(style, hs.style);
//}
//
//hasDMA::~hasDMA()
//{
//	delete[] style;
//}
//
//hasDMA& hasDMA::operator=(const hasDMA& hs)
//{
//	if (this == &hs)
//	{
//		return *this;
//	}
//	baseDMA::operator=(hs);		// copy base portion
//	delete[] style;				// prepare for new style
//	style = new char[std::strlen(hs.style) + 1];
//	std::strcpy(style, hs.style);
//	return *this;
//}
//
//std::ostream& operator<<(std::ostream& os, const hasDMA& hs)
//{
//	os << (const baseDMA&)hs;
//	os << "Style: " << hs.style << std::endl;
//	return os;
//}
//
//// usedma.cpp -- inheritance, friends, and DMA
//// compile with dma.cpp
//int main()
//{
//	using std::cout;
//	using std::endl;
//
//	baseDMA shirt("Portabelly", 8);
//	lacksDMA balloon("red", "Blimpo", 4);
//	hasDMA map("Mercator", "Buffalo Keys", 5);
//
//	cout << "Displaying baseDMA object:\n";
//	cout << shirt << endl;
//
//	cout << "Displaying lacksDMA object:\n";
//	cout << balloon << endl;
//
//	cout << "Displaying hasDMA object:\n";
//	cout << map << endl;
//
//	lacksDMA balloon2(balloon);
//	cout << "Result of lacksDMA copy:\n";
//	cout << balloon2 << endl;
//
//	hasDMA map2;
//	map2 = map;
//	cout << "Result of hasDMA assignment:\n";
//	cout << map2 << endl;
//	
//	return 0;
//}

// studentc.cpp -- Student class using containment
//#include "test_0301.h"
//using std::ostream;
//using std::endl;
//using std::istream;
//using std::string;
//
//// public methods
//double Student::Average() const
//{
//	if (scores.size() > 0)
//	{
//		return scores.sum() / scores.size();
//	}
//	else
//	{
//		return 0;
//	}
//}
//
//const string& Student::Name() const
//{
//	return name;
//}
//
//double& Student::operator[](int i)
//{
//	return scores[i];		// use valarray<double>::operator[] ()
//}
//
//double Student::operator[](int i) const
//{
//	return scores[i];
//}
//
//// private method
//ostream& Student::arr_out(ostream& os) const
//{
//	int i;
//	int lim = scores.size();
//	if (lim > 0)
//	{
//		for (i = 0; i < lim; i++)
//		{
//			os << scores[i] << " ";
//			if (i % 5 == 4)
//			{
//				os << endl;
//			}
//		}
//		if (i % 5 != 0)
//		{
//			os << endl;
//		}
//	}
//	else
//	{
//		os << " empty array ";
//	}
//	return os;
//}
//
//// friends
//// use string version of operator>>()
//istream& operator>>(istream& is, Student& stu)
//{
//	is >> stu.name;
//	return is;
//}
//
//// use string friend getline(ostream&, const string&)
//istream& getline(istream& is, Student& stu)
//{
//	getline(is, stu.name);
//	return is;
//}
//
//// use string version of operator<<()
//ostream& operator<<(ostream& os, const Student& stu)
//{
//	os << "Scores for " << stu.name << ":\n";
//	stu.arr_out(os);		// use private method for scores
//	return os;
//}
//
//// use_stuc.cpp -- using a composite class
//// complie with studentc.cpp
//using std::cin;
//using std::cout;
//using std::endl;
//
//void set(Student& sa, int n);
//
//const int pupils = 3;
//const int quizzes = 5;
//
//int main()
//{
//	Student ada[pupils] =
//	{
//		Student(quizzes),
//		Student(quizzes),
//		Student(quizzes)
//	};
//
//	int i;
//	for (i = 0; i < pupils; i++)
//	{
//		set(ada[i], quizzes);
//	}
//	cout << "\nStudent List:\n";
//	for (i = 0; i < pupils; i++)
//	{
//		cout << ada[i].Name() << endl;
//	}
//	cout << "\nResults:";
//	for (i = 0; i < pupils; i++)
//	{
//		cout << endl << ada[i];
//		cout << "average: " << ada[i].Average() << endl;
//	}
//	cout << "Done.\n";
//
//	return 0;
//}
//
//void set(Student& sa, int n)
//{
//	cout << "Please enter the student's name: ";
//	getline(cin, sa);
//	cout << "Please enter " << n << " quiz scores:\n";
//	for (int i = 0; i < n; i++)
//	{
//		cin >> sa[i];
//	}
//	while (cin.get() != '\n')
//	{
//		continue;
//	}
//}

// studenti.cpp -- Student class using private inheritance
//#include "test_0301.h"
//using std::ostream;
//using std::endl;
//using std::istream;
//using std::string;
//
//// public methods
//double Student::Average() const
//{
//	if (ArrayDb::size() > 0)
//	{
//		return ArrayDb::sum() / ArrayDb::size();
//	}
//	else
//	{
//		return 0;
//	}
//}
//
//const string& Student::Name() const
//{
//	return (const string&)*this;
//}
//
//double& Student::operator[](int i)
//{
//	return ArrayDb::operator[](i);		// use ArrayDb::operator[]()
//}
//
//double Student::operator[](int i) const
//{
//	return ArrayDb::operator[](i);
//}
//
//// private method
//ostream& Student::arr_out(ostream& os) const
//{
//	int i;
//	int lim = ArrayDb::size();
//	if (lim > 0)
//	{
//		for (i = 0; i < lim; i++)
//		{
//			os << ArrayDb::operator[](i) << " ";
//			if (i % 5 == 4)
//			{
//				os << endl;
//			}
//		}
//		if (i % 5 != 0)
//		{
//			os << endl;
//		}
//	}
//	else
//	{
//		os << " empty array ";
//	}
//	return os;
//}
//
//// friends
//// use String version of operator>>()
//istream& operator>>(istream& is, Student& stu)
//{
//	is >> (string&)stu;
//	return is;
//}
//
//// use string friend getline(ostream&, const string&)
//istream& getline(istream& is, Student& stu)
//{
//	getline(is, (string&)stu);
//	return is;
//}
//
//// use string version of operator<<()
//ostream& operator<<(ostream& os, const Student& stu)
//{
//	os << "Scores for " << (const string&)stu << ":\n";
//	stu.arr_out(os);	// use private method for scores
//	return os;
//}
//
//// use_stui.cpp -- using a class with private inheritance
//// complie with studenti.cpp
//using std::cin;
//using std::cout;
//using std::endl;
//
//void set(Student& sa, int n);
//
//const int pupils = 3;
//const int quizzes = 5;
//
//int main()
//{
//	Student ada[pupils] =
//	{
//		Student(quizzes),
//		Student(quizzes),
//		Student(quizzes)
//	};
//
//	int i;
//	for (i = 0; i < pupils; i++)
//	{
//		set(ada[i], quizzes);
//	}
//	cout << "\nStudent List:\n";
//	for (i = 0; i < pupils; i++)
//	{
//		cout << ada[i].Name() << endl;
//	}
//	cout << "\nResults:";
//	for (i = 0; i < pupils; i++)
//	{
//		cout << endl << ada[i];
//		cout << "average: " << ada[i].Average() << endl;
//	}
//	cout << "Done.\n";
//
//	return 0;
//}
//
//void set(Student& sa, int n)
//{
//	cout << "Please enter the student's name: ";
//	getline(cin, sa);
//	cout << "Please enter " << n << " quiz scores:\n";
//	for (int i = 0; i < n; i++)
//	{
//		cin >> sa[i];
//	}
//	while (cin.get() != '\n')
//	{
//		continue;
//	}
//}